﻿#define _CRT_SECURE_NO_WARNINGS 1

//模仿qsort的功能实现一个通用的冒泡排序
#include<stdio.h>
#include<stdlib.h>

//整数比较实现
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}

//定义一个结构体函数
struct student
{
	char name[20];
	int id;
	int age;
};

//结构体比较实现（基于年龄）
int cmp_struct_student_age(const void* e1, const void* e2)
{
	return ((struct student*)e1)->age - ((struct student*)e2)->age;
}

//交换函数实现
void swap(char* e1, char* e2, int elum_sz)
{
	int i = 0;
	char tmp = '\0';
	for (i = 0; i < elum_sz; i++)
	{
		tmp = *(e2 + i);
		*(e2 + i) = *(e1 + i);
		*(e1 + i) = tmp;
	}
}

//模仿qsort实现函数
void buddle_sort(void* base, int arr_sz, int elum_sz, int (*cmp)(const void* e1, const void* e2))
{
	int i = 0;
	int j = 0;
	//冒泡
	for (i = 0; i < arr_sz - 1; i++)
	{
		//第一遍冒泡
		for (j = 0; j < arr_sz - 1 - i; j++)
		{
			if ((cmp((char*)base + j * elum_sz, (char*)base + (j + 1) * elum_sz)) > 0)
				//交换
				swap((char*)base + j * elum_sz, (char*)base + (j + 1) * elum_sz, elum_sz);
		}
	}

}



int main()
{
	//定义一个整数数组
	int arr[9] = { 2,1,4,7,3,6,5,9,8 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	//定义一个结构体函数数组
	struct student A328[3] = { {"xiewenlong",2007210220,21}, {"wuyingjie",2008210220,22} ,{"anwenpeng",2009210220,20} };
	int sz2 = sizeof(A328) / sizeof(A328[0]);

	//调用函数,实现整形数组的排序
	buddle_sort(arr, sz, sizeof(arr[0]), cmp_int);

	//打印整数数组
	int i = 0;
	for (i = 0; i < sz; i++)
		printf("%d ", arr[i]);
	putchar('\n');

	//调用函数，实现结构体数组的排序
	buddle_sort(A328, sz2, sizeof(A328[0]), cmp_struct_student_age);

	return 0;
}